package controlador;

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.ArrayList;

import javax.swing.JFrame;
import javax.swing.table.AbstractTableModel;

import modelo.Datos;
import modelo.Ingrediente;
import modelo.Producto;

import vista.DlgListadoIngredientes;
import java.util.*;

public class ContListadoIngredientes {
	private class Detalle {
		public Detalle(Ingrediente ingr) {
			ingrediente = ingr;
			productos = "";

			ArrayList<Producto> t = Datos.getInstancia().getProductos().productosPorIngrediente(ingr.getCodigo());
			
			cantidad = t.size();
			
			boolean b = true;
			for (Producto pr : t) { 
				if (b) b = false; else this.productos += ", ";
				this.productos += pr.getNombre();
			}
			
		}
		
		Ingrediente ingrediente;
		int cantidad;
		String productos;
	}
	
	private DlgListadoIngredientes dlg = null;
	private Detalle[] lista = null;
	private AbstractTableModel tmodelo = null;
	
	public ContListadoIngredientes() {
	}
	
	public void mostrar(JFrame frame) {
		dlg = new DlgListadoIngredientes(frame, this);
		dlg.setLocationRelativeTo(null);
		dlg.setVisible(true);
		
		ArrayList<Ingrediente> lst = Datos.getInstancia().getIngredientes().ingredientesGeneral();
		
		lista = new Detalle[lst.size()];
		for (int i = 0; i < lst.size(); ++i)
			lista[i] = new Detalle(lst.get(i));
		
		Arrays.sort(lista, new Comparator<Detalle>() {
			@Override
			public int compare(Detalle a, Detalle b) {
				return b.cantidad - a.cantidad;
			}
		});
		
		tmodelo = new AbstractTableModel() {
			private static final long serialVersionUID = 1L;

			@Override
			public int getColumnCount() {
				return 3;
			}

			@Override
			public String getColumnName(int col) {
				switch (col) {
				case 0: return "Ingrediente";
				case 1: return "Cantidad";
				case 2: return "Producto";
				}
				return null;
			}

			@Override
			public int getRowCount() {
				return lista.length;
			}

			@Override
			public Object getValueAt(int row, int col) {
				Detalle obj = lista[row]; 
				switch (col) {
				case 0: return obj.ingrediente.getNombre();
				case 1: return obj.cantidad;
				case 2: return obj.productos;
				}
				return null;
			}
		};
		
		dlg.getTblIngredientes().setModel(tmodelo);
		
		dlg.getRbAscendente().addActionListener(new ActionListener() {
			@Override
			public void actionPerformed(ActionEvent arg0) {
				Arrays.sort(lista, new Comparator<Detalle>() {
					@Override
					public int compare(Detalle a, Detalle b) {
						return a.cantidad - b.cantidad;
					}
				});
				tmodelo.fireTableDataChanged();
			}
		});
		
		dlg.getRbDescendente().addActionListener(new ActionListener(){
			@Override
			public void actionPerformed(ActionEvent arg0) {
				Arrays.sort(lista, new Comparator<Detalle>() {
					@Override
					public int compare(Detalle a, Detalle b) {
						return b.cantidad - a.cantidad;
					}
				});
				tmodelo.fireTableDataChanged();
			}
		});
		
		dlg.getBtSalir().addActionListener(new ActionListener() {
			@Override
			public void actionPerformed(ActionEvent arg0) {
				dlg.dispose();
			}
		});
		
		dlg.getRbDescendente().setSelected(true);
	}

}
